# 介绍
传统 Echo 模型:
- Java 客户端:键盘输入 -> 发送数据 -> Java 服务端
- Java 服务端:接收数据 -> 处理数据 -> 发送数据 -> Java 客户端
- Java 客户端:接收数据
# 样例代码
# EchoServer
class HandlerThread implements Runnable {
private Socket client;
public HandlerThread(Socket client) {
this.client = client;
}
@Override
public void run() {
try {
PrintStream output = new PrintStream(client.getOutputStream());
Scanner scanner = new Scanner(client.getInputStream());
scanner.useDelimiter("\n");
while (true) {
if (scanner.hasNext()) {
// 注意不能漏掉 trim,因为最后还要一个换行符
String value = scanner.next().trim();
if ("bye".equalsIgnoreCase(value)) {
// 结束交互
output.println("[Echo] See you!");
break;
} else {
output.println("[Echo] " + value);
}
}
}
client.close();
} catch (Exception e) {}
}
}
public class EchoServer {
public static void main(String[] args) throws Exception{
try (ServerSocket server = new ServerSocket(9090)) {
while (true) {
Socket client = server.accept();
System.out.println("New connection established successfully!");
new Thread(new HandlerThread(client)).start();
}
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# EchoClient
public class EchoClient {
static KeyboardInputReader keyboard = new KeyboardInputReader();
public static void main(String[] args) throws Exception {
try (Socket socket = new Socket(InetAddress.getLocalHost(), 9090)) {
PrintStream output = new PrintStream(socket.getOutputStream());
Scanner scanner = new Scanner(socket.getInputStream());
scanner.useDelimiter("\n");
while (true) {
String value =
keyboard.getStringNotNull("Please input data to be sent: ");
output.println(value);
if (scanner.hasNext()) {
System.err.println(scanner.next().trim());
}
if ("bye".equalsIgnoreCase(value)) {
break;
}
}
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22